[アップデート]Amazon ElastiCacheにRedis5.0互換が追加されました
はじめに
おはようございます、加藤です。Amazon ElastiCache(以降、ElastiCache)にRedis5.0互換が追加されました!(え!?遅いですか?すいませんSTREAM型を事前に学習できておらず、ただアップデートだけ伝えるのもナーと思い触っていたら時間がかかってしまいました。)
New – Redis 5.0 Compatibility for Amazon ElastiCache | AWS News Blog
Redis 5.0の変更点
Redis5.0の変更の目玉であるStream型について一部ですが動作を説明していきます。
Stream
XADD コマンド
新しく追加された Stream というデータ型で、ユースケースとしては時系列系のログデータを格納する為に使用します。
redis-cli
で動作を確認してみます。
Stream型の格納にはXADD
を使用します。第一引数はキー名で第2引数はエントリーIDです。エントリーIDのフォーマットは-
で下記のように*
を指定している場合は自動生成されます。
> XADD key ID field string [field string ...]
データの格納XADD
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.8 "1542071255977-0" redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.9 "1542071427704-0" redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.7 "1542071433847-0" #重複するエントリーIDでXADDするとerrorが返る redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1542071433847-0 sensor-id 1234 temperature 0.0 (error) ERR The ID specified in XADD is equal or smaller than the target stream top item #既存のストリームより小さいエントリーIDでXADDするとerrorが返る redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1442071433847-1 sensor-id 1234 temperature 0.0 (error) ERR The ID specified in XADD is equal or smaller than the target stream top item #sequenceNumberを変更してXADDした redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1542071433847-1 sensor-id 1234 temperature 0.0 "1542071433847-1"
XRANGE, XREVRANGE コマンド
次に格納したデータを取り出しましょう、XRANGE
,XREVRANGE
コマンドを使用します。
XRANGE
, XREVRANGE
コマンドは指定した範囲内の値を返してくれます。全ての値を取得したい場合は、最小の値を意味する-
と最大の値を意味する+
を使用します。StartとEndを同じ値にすることも可能です。
> XRANGE key start end [COUNT count] > XREVRANGE key end start [COUNT count]
範囲内の値の取り出しXRANGE
#全件取得 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream - + 1) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" 2) 1) "1542071427704-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.9" 3) 1) "1542071433847-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.7" 4) 1) "1542071433847-1" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "0.0" #範囲指定 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream 1542071255977-0 1542071255978-0 1) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" #範囲指定(同一値) redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream 1542071433847-0 1542071433847-0 1) 1) "1542071433847-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.7" #全件の内、先頭から2つ取得 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream - + COUNT 2 1) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" 2) 1) "1542071427704-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.9"
範囲内の値の取り出しXREVRANGE
#全件取得 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREVRANGE mystream + - 1) 1) "1542071433847-1" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "0.0" 2) 1) "1542071433847-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.7" 3) 1) "1542071427704-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.9" 4) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" #全件の内、末尾から2つ取得 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREVRANGE mystream + - COUNT 2 1) 1) "1542071433847-1" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "0.0" 2) 1) "1542071433847-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.7"
XREAD コマンド
新しいストリームが到着するまでリッスンするには、XREAD
を使用します、XRANGE
と比べてこちらはブロッキングが可能です。(あるXREAD
が実行中に他から読み取ることはできない)
オプションは3つあります。
- COUNT
- BLOCK
- STREAMS
COUNT
ストリーム毎に読み取るデータの件数を指定します。2つのストリームに対してなら2✕2で4件取得します。
BLOCK
オプションとして使用することで、他からの読み込みをブロッキングします。ミリ秒でブロッキング時間の指定ができ0
で指定すると永続的にブロッキングします。COUNTと併用した場合は、目標件数を読み込んだ後にブロッキングを解除します。
ブロッキング無しは、tail
コマンドで、ブロッキング有りはtail -f
と考えてください。指定した時間ストリームを取得するまで待機し続けます。
$
というIDは現在Streamに格納されている最後のエントリーIDと同義です。つまり実行時以降に追加されたStreamを対象とするという意味です。
COUNT
とSTREAM
は併用が可能ですが、その場合はCOUNT
は1として扱われます。(ここ実は自信がないので訂正あればコメントにお願いします)
> XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
新規項目の読み込みXREAD
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD STREAMS mystream 0 1) 1) "mystream" 2) 1) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" 2) 1) "1542071427704-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.9" 3) 1) "1542071433847-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.7" 4) 1) "1542071433847-1" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "0.0" #全件の内、先頭から2つ取得 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD COUNT 2 STREAMS mystream 0 1) 1) "mystream" 2) 1) 1) "1542071255977-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.8" 2) 1) "1542071427704-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "19.9" # 1000msの間Streamに追加されるのを待ち所得する。取得できなかった場合はnil redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD BLOCK 1000 STREAMS mystream $ (nil) (1.12s) # Streamに追加されるのを待ち所得する。 redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD BLOCK 0 STREAMS mystream $ 1) 1) "mystream" 2) 1) 1) "1542206055992-0" 2) 1) "sensor-id" 2) "1234" 3) "temperature" 4) "20.0" (19.73s)
etc
他にもStream型に対して使用するコマンドはあります、下記URLでご確認頂ければと思います。 https://redis.io/commands/xack
あとがき
Stream型の用途としては、チャットシステムとして使用するという記載をよく見ます。あえて詳細を見ないで自分なりに他の仕組みと組み合わせて考えるという謎の遊びにハマっていますが、いずれはブログとして消化したいです。 以上、遅くなりましたがElastiCacheのアップデート情報でした。